/**
 * ES6对象的赋值器（setter）和取值器（getter）->（Java中面向对象的三大特性之一的   封装）：
    对属性的访问进行拦截，起到保护的作用
    getter：获取   属性值触发，
    setter：设置（赋值） 属性值 触发

    也可以只有getter（只能获取，不能赋值），或者setter（只能赋值，不能获取）
    一般二者都会同时出现
 */

// const beauty = {
//   name: '貂蝉',
// js中的一种约定：以下划线开头的属性，一般表示私有属性，类似Java中的访问权限修饰符
//   _waistline: 50,
// }

// ES5，对象的静态方法，定义属性添加getter和setter，对属性的访问进行拦截
// Object.defineProperty(beauty, 'waistline', {
// 获取waistline自动触发
//   get () {
//     return this._waistline
//   },
// 赋值waistline 自动触发，newVal就是要赋的新值
//   set (newVal) {
// 对赋的新值进行必要的判断
//     if (newVal < 40 || newVal > 80) {
//       newVal = 60
//     }
//     this._waistline = newVal
//   }
// })

const beauty = {
  name: '貂蝉',
  _waistline: 50,
  _age: 30,
  // 取值器(getter)
  get waistline () {
    // console.log('get')
    return this._waistline
  },
  // 赋值器(setter)
  set waistline (newVal) {
    console.log('set', newVal)
    // 对赋的新值进行必要的判断
    if (newVal < 40 || newVal > 80) {
      newVal = 60
    }
    this._waistline = newVal
  },

  get age () {
    return 18
  },
  set age (newVal) {
    if (newVal < 18 || newVal > 40) {
      newVal = 20
    }
    this._age = newVal
  }
}

// console.log(beauty)
// console.log(beauty.waistline)
// beauty.waistline = 100
console.log(beauty)
console.log(beauty.age)// ? 18
beauty.age = 50
console.log(beauty)
console.log(beauty.age)// ? 18


